package chapter010;

import java.io.File;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.*;

/**
 * Java 内置日志类
 * JUL全称java.util.logging.Logger，JDK自带的日志系统，从JDK1.4就有了。
 * 因为log4j的存在，这个logger一直沉默着，其实在一些测试性的代码中，jdk自带的logger比log4j更方便。
 * JUL是自带具体实现的，与log4j、logback等类似，而不是像JCL、slf4j那样的日志接口封装。
 *
 * 参考链接:
 * https://blog.csdn.net/waitgod/article/details/78750184
 * https://blog.csdn.net/qqxiaoshouhua/article/details/38682069
 *
 * @author Jack魏
 */
public class Point01 {
    /**
     *  1. 第一步创建打印日志对象 logger
     */
    private final static Logger logger = Logger.getLogger(Point01.class.getName());
    protected static java.util.logging.FileHandler FileHandler = null; //实例化的FileHandler对象
    protected static String logDir = "D:/java-log/"; //日志文件存放路径
    protected static String date_format = "yyyy-MM-dd HH:mm:ss"; //记录文件的日期格式
    protected static String filenameformat = "yyyy-MM-dd"; //记录文件的日期格式

    static {
        //设置日志输出的等级值
        logger.setLevel(Level.ALL);
        //判断文件夹是否存在，不存在则创建
        File Dir = new File(logDir);
        checkDir(Dir);
        //以当前日期为文件名创建文件
        String logFile = logDir + getDateTime(filenameformat) + ".txt";
        if (FileHandler == null) {
            //以追加方式写文件
            try {
                FileHandler = new FileHandler(logFile, true);
            } catch (IOException e) {
                e.printStackTrace();
            }
            //设置记录级别
            FileHandler.setLevel(Level.ALL);
            //以自定义格式记录日志
            FileHandler.setFormatter(new MyLogHander());
            //增加处理的文件处理对象
            logger.addHandler(FileHandler);
        }
    }

    public static void main(String[] args) throws IOException {

        System.out.println("普通信息输出");
        System.err.println("错误信息输出");

        logger.finest("我是最好的信息");
        logger.finer("我是比较好的信息");
        logger.fine("我是好的信息");
        logger.config("我是配置信息");
        logger.info("我是一般信息");
        logger.warning("我是警告信息");
        logger.severe("我是最坏信息");

    }

    /**
     * 检查文件夹不存在时则创建文件夹
     */
    public static void checkDir(File file) {
        if (!file.isDirectory()) {
            file.mkdir();
        }
    }

    /**
     * 返回当前日期
     */
    public static String getDateTime(String dateFormat) {
        //返回当前日期的文件名
        Date date = new Date();
        SimpleDateFormat DateTime = new SimpleDateFormat(dateFormat);
        return DateTime.format(date);
    }

    /**
     * 日志文件记录的format格式
     *
     * @author caisicen
     */
    static class MyLogHander extends Formatter {
        @Override
        public String format(LogRecord record) {
            String name = ManagementFactory.getRuntimeMXBean().getName(); //获取进程信息
            String pid = name.split("@")[0]; //进程号
            // 最开始的行号
            StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
            int number = stackTrace[stackTrace.length-1].getLineNumber();

            String Format = "级别：" + record.getLevel() + " | 时间戳：" + record.getMillis() + " | 进程号：" + pid + " | 线程号：" + Thread.currentThread().getId()
                    + " | 调用的类：" + record.getSourceClassName() + " | 调用的方法：" + record.getSourceMethodName() + " | 调用日志所在行数：" + number
                    + "\n 内容：" + record.getMessage();
            Format += "\n\n";
            return Format;
        }
    }
}
